from docx.document import Document
from docx.oxml.ns import qn
from docx.shared import Pt, RGBColor
from docx.text.run import Run
from docx.text.paragraph import Paragraph

"""
这里封装了一些与Word文档进行交互的操作

class:
    ReportDocument: Word文档操作的封装类
"""


class ReportDocument(object):
    """
    对于常用的Word文档操作进行封装，简化直接使用python-docx库的操作步骤

    field:
        document: 需要操作的Word文档，需要从外界传递
        paragraph: Word文档的段落对象
        run: 不知道怎么翻译，总之就是新建paragraph时返回的对象，可以对字体进行操作

    method:
        set_font: 设置文字加粗、字号、字体
        set_color: 设置字体颜色
        add_paragraph: 添加段落，可以是新建一段，也可以在原来段落上追加
        add_page_break: 添加分页符
        add_title: 添加标题
        add_meta: 添加作者信息
        add_header: 添加页眉水印信息
        save: 保存文件
    """
    document: Document
    run: Run
    paragraph: Paragraph

    def __init__(self, document: Document):
        self.document = document

        # 创建文档时先添加一个自然段，初始化paragraph字段
        self.paragraph = document.add_paragraph("")

    def set_font(self, font_size: int, bold: bool = False, font_name: str = "FangSong", c_font_name: str = "FangSong"):
        """

        :param font_size: 字体字号大小
        :param bold: 是否字体加粗，默认为False
        :param font_name: 字体，默认为仿宋（设置为仿宋只是个人癖好）
        :param c_font_name: 中文字体，同上
        :return:
        """
        self.run.font.size = Pt(font_size)
        self.run.font.bold = bold
        self.run.font.name = font_name
        self.run.element.rPr.rFonts.set(qn('w:eastAsia'), c_font_name)

    def set_color(self, r: int, g: int, b: int):
        """
        设置文字颜色，使用RGB格式
        """
        self.run.font.color.rgb = RGBColor(r, g, b)

    def add_paragraph(self, text: str, new_paragraph: bool = False):
        """
        添加文字

        :param text: 需要添加的文本
        :param new_paragraph: 是否另起一段，默认值为False
        """
        if new_paragraph:
            self.paragraph = self.document.add_paragraph()
        self.run = self.paragraph.add_run(text)

    def add_page_break(self):
        """
        添加分页符
        """
        self.document.add_page_break()

    def save(self, dest: str):
        self.document.save(dest)

    def add_title(self, text: str, font_size: int = 21, bold: bool = True):
        """
        另起一段，添加标题
        :param text: 标题的文字
        :param font_size: 字体，默认为21磅
        :param bold: 是否字体加粗，默认为True
        """
        self.add_paragraph(text, new_paragraph=True)
        self.set_font(font_size, bold)

    def add_meta(self, text: str):
        """
        另起一段，添加作者信息
        """
        self.add_paragraph(text, new_paragraph=True)
        self.set_font(18, False)

    def add_header(self, text: str):
        """
        添加页眉内容，这里主要用作提示功能
        """
        header = self.document.sections[0].header
        paragraph = header.paragraphs[0]
        paragraph.text = text
